﻿using BusinessLayer;
using EntitiesLayer;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Input;

namespace QuidditchWpf.ViewModel
{
    public class GestionReservationsViewModel : ViewModelBase
    {
        #region Attributes

        private ObservableCollection<ReservationViewModel> viewReservationModel = new ObservableCollection<ReservationViewModel>();

        #endregion

        #region Commandes

        public ICommand AddCommand
        {
            get;
            private set;
        }

        public ICommand UpdateCommand
        {
            get;
            private set;
        }

        public ICommand EraseCommand
        {
            get;
            private set;
        }

        public ObservableCollection<ReservationViewModel> ViewReservationModel
        {
            get 
            { 
                return viewReservationModel; 
            }
        }

        #endregion

        #region Constructeurs

        public GestionReservationsViewModel()
        {
            InitListeReservation();

            viewReservationModel.Add(new ReservationViewModel());

            AddCommand = new RelayCommand(AddReservation, AddReservationCanExecute);
            UpdateCommand = new RelayCommand(UpdateReservation, UpdateReservationCanExecute);
            EraseCommand = new RelayCommand(EraseReservation, EraseReservationCanExecute);
        }

        #endregion

        #region Méthodes Command

        /// <summary>
        /// Ajout d'une réservation
        /// </summary>
        /// <param name="id"> Paramètre non utilisé </param>
        public void AddReservation(object id)
        {
            // Ajouter réservation, prendre le dernier élément de la liste
            // Aucun controle n'a été fait, si l'utilisateur avait sélectionné le premier est fait Add 
            ReservationViewModel resVm = viewReservationModel.Single(r => r.ID == 0);
            Reservation reservation = resVm.Reservation;
            //reservation.ID = CoupeManager.Manager.Reservations.Count > 0 ? CoupeManager.Manager.Reservations.Max(r => r.ID) + 1 : 1;
            //CoupeManager.Manager.Reservations.Add(reservation);
            //viewReservationModel.Add(new ReservationViewModel());

            reservation.ID = CoupeManager.Manager.AddReservation(reservation).ID;
            viewReservationModel.Add(new ReservationViewModel());
        }

        /// <summary>
        /// Détermine si l'action Add est possible
        /// </summary>
        /// <param name="parameter"> Paramètre de la Command </param>
        /// <returns> True si action possible </returns>
        public bool AddReservationCanExecute(object parameter)
        {
            if(Convert.ToInt16(parameter) == 0)
                if (viewReservationModel.Single(r => r.ID == Convert.ToInt16(0)).isFullyInformed())
                    return true;

            return false;
        }

        /// <summary>
        /// Mise à jour d'une réservation
        /// </summary>
        /// <param name="id"> Identifiant de la réservation </param>
        public void UpdateReservation(object id)
        {
            ReservationViewModel res = viewReservationModel.Single(r => r.ID == Convert.ToInt16(id));
            // Mise à jour réservation sélectionnée
            CoupeManager.Manager.UpdateReservation(res.Reservation);
        }

        /// <summary>
        /// Détermine si l'action Update est possible
        /// </summary>
        /// <param name="parameter"> Paramètre de la Command </param>
        /// <returns> True si action possible </returns>
        public bool UpdateReservationCanExecute(object parameter)
        {
            if (Convert.ToInt16(parameter) == 0)
                return false;

            return true;
        }

        /// <summary>
        /// Suppression d'une réservation
        /// </summary>
        /// <param name="id"> Identifiant de la réservation </param>
        public void EraseReservation(object id)
        {
            // Supprimer reservation sélectionnée
            viewReservationModel.Remove(viewReservationModel.Single(r => r.ID == Convert.ToInt16(id)));
            CoupeManager.Manager.DeleteReservation(Convert.ToInt32(id));
            //CoupeManager.Manager.Reservations.Remove(CoupeManager.Manager.Reservations.Single(r => r.ID == Convert.ToInt16(id)));
        }

        /// <summary>
        /// Détermine si l'action Erase est possible
        /// </summary>
        /// <param name="parameter"> Paramètre de la Command </param>
        /// <returns> True si action possible </returns>
        public bool EraseReservationCanExecute(object parameter)
        {
            if (Convert.ToInt16(parameter) == 0)
                return false;

            return true;
        }

        #endregion

        #region Utils

        /// <summary>
        /// Permet d'initialiser la liste des réservation.
        /// </summary>
        private void InitListeReservation()
        {
            //viewReservationModel.Clear();
            foreach (Reservation reservation in CoupeManager.Manager.Reservations)
                viewReservationModel.Add(new ReservationViewModel(reservation));
        }

        #endregion
    }
}
